package com.bnz.cart.service.impl;

import com.alibaba.fastjson.JSON;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bnz.cart.dao.ItemMapper;
import com.bnz.cart.entity.Item;
import com.bnz.cart.entity.OrderItem;
import com.bnz.cart.entity.group.Cart;
import com.bnz.cart.service.CartService;
import com.bnz.common.utils.IdWorker;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Service
public class CartServiceImpl  implements CartService {
	@Autowired
	private StringRedisTemplate redisTemplate;
	@Autowired
	private ItemMapper itemMapper;
	@Autowired
	private IdWorker idWorker;
	//1. 添加购物车到redis中
	@Override
	public List<Cart> addCart(Long itemId, int num, String name) {
		//1.1 根据itemId查询出item商品
		Item item = itemMapper.selectById(itemId);
		//1.2 根据item得到商家id
		String sellerId = item.getSellerId();
		//1.3 根据登录名，得到购物车列表的字符串
		String cartStr = redisTemplate.opsForValue().get(name);
		//1.4 转换为购物车列表
		//1.4.1 进行兼容性处理
		if(StringUtils.isBlank(cartStr)){
			cartStr = "[]";
		}
		//1.4.2 进行转换
		List<Cart> cartList = JSON.parseArray(cartStr, Cart.class);
		System.out.println("cartList = " + cartList);
		//1.5 判断购物车是否存在
		//1.5.1 根据sellerId查询出一个购物车
		Cart cart = findCartBySellerId(cartList,sellerId);
		//1.5.2 如果没有购物车就构造一个新的购物车
		if(cart == null){
			cart = createCart(item,num);
			//添加到购物车列表中
			cartList.add(cart);
		}else{      //1.5.3 如果购物车己存在
			//① 判断此购物车中的购物项是否存在
			List<OrderItem> orderItemList = cart.getOrderItemList();
			//② 判断是否有此购物项
			OrderItem orderItem =  getOrderItem(itemId, orderItemList);
			//③ 有此购物项，就修改商品小计、金额
			if(orderItem != null){
				orderItem.setNum(orderItem.getNum() + num); //修改数量
				orderItem.setTotalFee(new BigDecimal(orderItem.getPrice().doubleValue() * orderItem.getNum())); //修改小计
			}else{ //④ 如果没有此购物项就创建它
				orderItem = createOrderItem(item, num);
				//② 添加购物项到购物车的购物列表中
				cart.getOrderItemList().add(orderItem);
			}
			//1.5.4 一些特殊情况的处理
			//情况一：某件购物项的数量为0，此时应从购物项列表中删除此商品
			if (orderItem.getNum() == 0) {
				cart.getOrderItemList().remove(orderItem);
			}
			//情况二：如果某个购物车中的购物项列表长度为0，应从购物车列表中删除此购物车
			if(cart.getOrderItemList().size() == 0){
				cartList.remove(cart);
			}
		}
		//1.6 最后，放到redis中
		redisTemplate.opsForValue().set(name,JSON.toJSONString(cartList));
		//返回
		return cartList;
	}

	//2. 根据sellerId查询购物车
	private Cart findCartBySellerId(List<Cart> cartList,String sellerId) {
		for (Cart cart : cartList) {
			if(cart.getSellerId().equals(sellerId)){
				return cart;
			}
		}
		return null;
	}
	//3. 创建购物车
	private Cart createCart(Item item,int num) {
		//3.1 定义购物车对象
		Cart cart = new Cart();
		//3.2 为购物车对象设置属性值
		cart.setSellerId(item.getSellerId());
		cart.setSellerName(item.getSeller());
		//3.3 为购物车定义购物项列表
		List<OrderItem> orderItemList = new ArrayList<>();
		OrderItem orderItem = createOrderItem(item,num);
		orderItemList.add(orderItem);
		cart.setOrderItemList(orderItemList);
		//3.4 返回购物车
		return cart;
	}
	//4. 创建订单项
	private OrderItem createOrderItem(Item item,int num) {
		OrderItem orderItem = new OrderItem();
		long id = idWorker.nextId();
		orderItem.setId(id);
		orderItem.setTitle(item.getTitle());
		orderItem.setSellerId(item.getSellerId());
		orderItem.setPicPath(item.getImage());
		orderItem.setItemId(item.getId());
		orderItem.setPrice(item.getPrice());
		orderItem.setNum(num);
		orderItem.setGoodsId(item.getGoodsId());
		orderItem.setTotalFee(new BigDecimal(num * item.getPrice().doubleValue()));
		return orderItem;
	}
	//5. 是否有此购物项
	private OrderItem getOrderItem(Long itemId, List<OrderItem> orderItemList) {
		for (OrderItem orderItem : orderItemList) {
			if (orderItem.getItemId().longValue() == itemId.longValue()) {
				return orderItem;
			}
		}
		return null;
	}
	//6. 得到购物车列表
	@Override
	public List<Cart> getCartList(String name) {
		//6.1 得到购物车列表字符串形式
		String cartStr = redisTemplate.opsForValue().get(name);
		//6.2 转换为购物车列表
		//6.2.1 进行兼容性处理
		if(StringUtils.isBlank(cartStr)){
			cartStr = "[]";
		}
		return JSON.parseArray(cartStr,Cart.class);
	}
}
